export default class Ids {
    constructor() {
        //池长度
        this.len = 1000;
        this.num = "0123456789";
        this.str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
        this.ids = new Set();
        //保持数据的全局不重复性，所以，在生成随机数前，如果有已存在的id，那么使用initData函数，初始oldList
        //此方法也只是在生成上有用，之后就会无用了
        this.oldList = null;
    }

    init() {
        let str = null;
        while (true) {
            if (this.ids.size > this.len) {
                break;
            }
            str = this.random();
            this.ids.add(str);
        }
    }
    /**加入已存在的数据，然后再进行校验池的数据是否达到要求 */
    initData(list) {
        if (list && list instanceof Array && list.length > 0) {
            this.oldList = list;
            this.ids = new Set(list);
        }
        this.init();
    }
    //生成4位随机字符串，且不能是数字开头
    random() {
        let str = null;
        //先生成开头的字母
        let first = Math.floor(Math.random() * this.str.length);
        str = this.str[first];
        //再生成后面的3位字母或数字
        let tmp = this.str + this.num;
        for (let i = 0; i < 3; i++) {
            let second = Math.floor(Math.random() * tmp.length);
            str += tmp[second];
        }

        return str;
    }
    //获取一个ID，获取后会从池中删除，获取时，校验是否有oldList，如果有，那么移除之，在进行获取
    get() {
        if (this.ids.size == 0) {
            throw new Error('没有可用的ID了');
        }
        //如果有旧ID存，那么将就ID从池中移除，因为在生成中已使用，此时oldList已经没有用了，如果存在，还会出问题
        if (this.oldList) {
            for (let i of this.oldList) {
                this.ids.delete(i);
            }
        }
        let first = this.ids.values().next().value;
        this.ids.delete(first);
        console.log("剩余ID数量:", this.ids.size);

        return first;
    }
}